const User = require('../models/users')
const Topic = require('../models/topics')
const Question = require('../models/questions')
const Answer = require('../models/answers')
const Comment = require('../models/comments')

// 判断用户是否存在
const checkUserExist = async (ctx, next) => {
  const user = await User.findById(ctx.params.id)
  if (!user) {
    ctx.throw(404, '用户不存在')
  }
  await next()
}

// 判断话题是否存在
const checkTopicExist = async (ctx, next) => {
  const topic = await Topic.findById(ctx.params.id)
  if (!topic) {
    ctx.throw(404, '话题不存在')
  }
  await next()
}

// 判断问题是否存在
const checkQuestionExist = async (ctx, next) => {
  const question = await Question.findById(ctx.params.id).populate('questioner')
  if (!question) {
    ctx.throw(404, '问题不存在')
  }
  ctx.state.question = question
  await next()
}

// 判断答案是否存在
const checkAnswerExist = async (ctx, next) => {
  const answer = await Answer.findById(ctx.params.id).select('answerer')
  if (!answer) {
    ctx.throw(404, '答案不存在')
  }
  // 只有在删改查答案时候 才检查此逻辑。赞/踩答案时候不检查。
  if (ctx.params.questionId && answer.question_id !== ctx.params.questionId) {
    ctx.throw(404, '该问题下没有此答案')
  }
  ctx.state.answer = answer
  await next()
}

// 判断评论是否存在
const checkCommentExist = async (ctx, next) => {
  const comment = await Comment.findById(ctx.params.id).select('commentator')
  if (!comment) {
    ctx.throw(404, '评论不存在')
  }
  // 只有在删改查答案时候 才检查此逻辑。赞/踩答案时候不检查。
  if (ctx.params.questionId && comment.question_id !== ctx.params.questionId) {
    ctx.throw(404, '该问题下没有此评论')
  }
  // 只有在删改查答案时候 才检查此逻辑。赞/踩答案时候不检查。
  if (ctx.params.answerId && comment.answer_id !== ctx.params.answerId) {
    ctx.throw(404, '该答案下没有此评论')
  }
  ctx.state.comment = comment
  await next()
}

module.exports = {
  checkUserExist,
  checkTopicExist,
  checkQuestionExist,
  checkAnswerExist,
  checkCommentExist
}
